重載overload
。overload
指的是可以定義相同的方法名稱
,但是當參數的個數
、型別
不同,在Java中不會出現錯誤,且當調用方法時,Java會判斷該使用哪一個方法。
程式碼:
class People {
// 定義屬性
String name;
int age;
public void drink(double ml){
}
public void drink(String day, double ml){
System.out.println(name + day + "天喝了" + ml + "cc的水");
}
public void drink(double ml, double cc){}
}
上面這樣,定義了三個drink
方法,但是由於參數個數
不同,型別
就算有一個相同,但是只要個數不同,依然符合overload
的格式。
特別要注意的是編譯器
參數個數
、型別
權限修飾符
、型別返回值
Java的編譯器在判斷類的方法時,首先是先看方法名稱
,不同時則判斷為不同的方法,相同時再去判斷參數的個數
和型別
。
遇到型別提昇
的情況時,編譯器會先調用相同型別的方法
,除非型別中其中一個參數需要提昇時,才會去調用符合情況的方法
。
程式碼:
public class PeopleTest{
public static void main(String[] args) {
People people = new People();
people.name = "Jack";
people.drink(1000.0); // 喝了1000.0cc的水
people.drink(50); // 喝了50cc的水
people.drink(150.9, 50) // ml = 150.9 , cc = 50.0
}
class People {
// 定義屬性
String name;
int age;
public void drink(double ml) {
System.out.println("喝了" + ml + "cc的水");
}
public void drink(int ml) {
System.out.println("喝了" + ml + "cc的水");
}
public void drink(String day, double ml) {
System.out.println(name + day + "天喝了" + ml + "cc的水");
}
public void drink(double ml, double cc) {
System.out.println("ml = " + ml + ", cc = " + cc);
}
}
}
可以看到在第四個drink()
方法中,雖然第二個參數寫的是int
型別50
,但是實際上Java會將它提昇為double
型別50.0
。
參數
在Java中寫方法時,有時候會確定參數
的型別
,但是不確定參數的個數
,這時候可以這樣寫
格式:
(型別 …參數名稱)
public class People {
public static void main(String[] args) {
People people = new People();
people.saySomething("hello","world","!");
}
public void saySomething(String ...strs) {
}
}
當參數除了不確定的數量外,還有其他的參數有聲明時,需要將...args
放在參數的最後
例如:
public void saySomething(String name, String ...strs) {
}
過去沒有...args
的寫法時,是使用Public void saySomething(String[] strs) {}
方式去定義不確定的參數個數,所以這樣的寫法是會出現報錯,因為編譯器認為這兩個是一樣的方式。
第一種:
Public void saySomething(String[] strs) {}
第二種:
Public void saySomething(String ...strs) {}
使用第一種方式宣告時,在調用時需要在參數中先實例化
這個陣列才能夠使用
Public void saySomething(String[] strs) {}
saySomething(new String[]{"hello","world"}
要遍歷...args
時,可以使用for
循環去調用
Public void saySomething(String ...strs) {
for(int i = 0; i < strs.length; i++) {
System.out.print(strs[i] + "\t");
}
}
當有overload
的情況時,會優先確認是否有相同個數的參數
,若找不到時才會去調用聲明...args
的方法
Public void saySomething(String ...strs) {
System.out.print("3333");
}
Public void saySomething(String str1, String str2) {
System.out.print("2222");
}
Public void saySomething(String str) {
System.out.print("1111");
}
saySomething(String "hello") // 1111
saySomething(String "hello",String "world") // 2222
saySomething(String "hello",String "hello",String "world") // 3333
saySomething(); // 3333
當沒有放任何參數時,也會調用使用...args
的這個方法。